<?php
use Framework\ServiceManager;
use HFC\Database\DatabaseClient;
use Framework\Module\ModuleManager;
use Test\Autoload\AutoloadSelfLoad;
use Autoload\ForOtherLoad;
use Autoload\API\ITestAPI;

class AutoloadTest extends PHPUnit_Framework_TestCase {

	protected function setUp () {
		require_once (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Framework' . DIRECTORY_SEPARATOR . 'App.php');
		
		$app = Framework\App::Instance();
	}

	/**
	 * 加载Framework里的类
	 */
	public function testLoadFramework () {
		if (! class_exists(ServiceManager::class)) {
			$this->fail('错误：加载Framework里的类失败。');
		}
	}

	/**
	 * 加载HFC里的类
	 */
	public function testLoadHFC () {
		if (! class_exists(DatabaseClient::class)) {
			$this->fail('错误：加载HFC里的类失败。');
		}
	}

	/**
	 * 加载自己模块的类
	 */
	public function testLoadSelfModule () {
		// 1. Controller 加载
		// 因为之前没有加载controller，所以要完成框架的功能，预加载一下test模块
		ModuleManager::Instance()->preloadModule('test');
		
		if (! class_exists(AutoloadSelfLoad::class)) {
			$this->fail('错误：加载自己模块的类失败。');
		}
		
		// 2.ModuleManager::get()加载
		$other = ModuleManager::Instance()->get('autoload');
		$s = $other->getService(ITestAPI::class);
		if (! $s->testSelfClassLoad()) {
			$this->fail('错误：另一个模块加载自己的类失败。');
		}
	}

	/**
	 * 不能加载其他模块的类
	 */
	public function testLoadOtherModule () {
		// 注意，这儿的类上面可能已经载入过了。
		if (class_exists(ForOtherLoad::class)) {
			$this->fail('错误：禁止加载其他模块的类。');
		}
	}

	/**
	 * 即测试useModule函数
	 */
	public function testLoadSameName () {
		$other = ModuleManager::Instance()->get('autoload');
		$s = $other->getService(ITestAPI::class);
		if (true !== $s->testSelfClassLoad()) {
			$this->fail('错误：测试useModule函数失败，无法加载other模块。');
		}
		
		$other = ModuleManager::Instance()->get('sameAutoload');
		$ss = $other->getService(\SameAutoload\API\ITestAPI::class);
		if ('theSame' !== $ss->testSelfClassLoad()) {
			$this->fail('错误：测试useModule函数失败，无法加载sameOther模块。');
		}
	}
}